package designPattern.decorator2
{
	import designPattern.decorator2.skillsAndAttack.Skill_A;
	import designPattern.decorator2.skillsAndAttack.Skill_C;
	import designPattern.decorator2.skillsAndAttack.Skill_D;

	public class Decorator2MainClass
	{
		/**
		 *装饰者模式的目的：
		 * 只给单个对象增加职责，而不是整个类增加职责。
		 * 即在不改变类的基本结构的情况下，在类中加入其他元素，保持类不变，用子类来装饰他。
		 *装饰者模式组成:  
		 * #一个组件类 Hero
		 * #一个装饰者类DecoratorHero
		 * #一个或多个具体的组件类HeroQ、HeroW
		 * #一个或多个具体的装饰者类Skill_A、Skill_B、Skill_C、Skill_D
		 *组成之间的关系：
		 * 组件类Hero是最基础的抽象类，具体的组件要继承Hero、一个装饰者类DecoratorHero也要继承装饰者类，
		 * 具体的装饰者类继承DecoratorHero类。
		 * 
		 *注意事项:
		 * $所有的类都继承组件类Hero
		 * $装饰者类传入组件类参数Hero的实例
		 * $在继承自组件类的装饰者类中的方法做文章，一般都要重写所继承的方法，在这个方法中加入具体的装饰代码 
		 */		
		public function Decorator2MainClass()
		{
			var hero:Hero = new HeroQ();//实例化一个具体的组件类，声明为基础组件类
			hero = new Skill_A(hero);//装饰A
			print(hero);
			
			var hero2:Hero = new HeroW();
			hero2 = new Skill_C(hero2);
			print(hero2);
			hero2 = new Skill_D(hero2);
			print(hero2);
			
			hero = new Skill_C(hero);
			print(hero);
			hero = new Skill_D(hero);
			print(hero);
		}
		
		private function print(hero:Hero):void
		{
			trace("Q:" + hero.useSkill("Q"));
			trace("W:" + hero.useSkill("W"));
			trace("A:" + hero.useSkill("A"));
			trace("B:" + hero.useSkill("B"));
			trace("C:" + hero.useSkill("C"));
			trace("D:" + hero.useSkill("D"));
			trace("\r");
		}
	}
}